iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0

今天開始講一些應用方面的東西,也是未為來的文章先做準備,今天的主題就是Thread線程,之前的的程式通常多以主線程執行就可以完成,不過在將來將會有許多耗時的工作,如果都塞在主線程可能就會出些大問題,也有些耗時的工作會被指定需要另開線程才能執行,像是執行SQL之類的。

概念

Q:當有耗時的工作,通常會另開線程執行,為什麼呢?
A:可以想像成在機場排隊登機,如果可以派一個人去幫你排隊完成託運(耗時工作),然後你自己繼續去執行託登機(主要工作),這樣的話是不是很美好的,開線程的概念就是如此。

常用角色

  • Thread
    • 可以想像成一個容器,負責管理要做的事,可以包含Runnable或複寫function run()。
  • Runnable
    • 包含function run(),也就是要做的事。

範例

//新增線程
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        runOnUiThread(()->{
            Toast.makeText(mContext,"託運開始",Toast.LENGTH_SHORT).show();
        });
        try {
            thread.sleep(4000);
            runOnUiThread(()->{
                Toast.makeText(mContext,"託運完成",Toast.LENGTH_SHORT).show();
            });
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});

runOnUiThread():通常是一些畫面上的功能需要在這線程之上執行,像這裡的Toast。

由於光看程式碼還是相當模糊,決定依照剛才的例子規劃出一個劇本
劇本設定:
託運需要四秒,而前小明往登機口需要八秒。上影片(clap clap):


可以看到在小明走到一半的時候就顯示託運完成,這就是線程的效果。

Thread 方法

  • start();
    • 表示線程將開始執行。
  • join();
    • 表示呼叫的線程要插隊,被暫停的只有那條正在執行並呼叫另一條執行緒物件的join()的執行緒而已。
  • wait();
    • 表示呼叫的線程要等待,直到notify() or nitifyAll()。
  • notify();
    • 隨機通知wait()的線程。
  • notifyAll();
    • 通知所有wait()的線程。

以上是比較常見的用法,當各位熟悉線程的觀念後,可以再依照這些方法進行延伸閱讀。

注意

  • 雖然看起來很棒,不過也不能無限開啟線程,這樣會影響之後的整體效率,所以管理線程的數量也是Thread的一大重點喔,最後點提一下,當Thread裡的run執行完成後就會被回收了,有興趣的也可以去仔細看看Thread的回收機制喔。

上一篇
精華筆記 Day13-- QRcode
下一篇
精華筆記 Day15-- Service
系列文
android studio 30天 精華筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言